Start simple: Germany Only

Data: Determinants of Electricity Prices

Using data from EMBER on European wholesale electricity prices (hourly - daily and monthly also exist). The hourly prices are the day-ahead wholesale prices by country.

Electricity Demand/Load

Total load per bidding zone per market time unit - in our case, total load, per country, per hour in MW.

Source

The following is data from ENTSO-E on hourly electricity loads.

Components: Actual total load (including losses without stored energy) = net generation – exports + imports – absorbed energy

## `summarise()` has grouped output by 'date_utc', 'country_code'. You can
## override using the `.groups` argument.

Generation by Resource

Actual Generation per Production Type from ENTSOE This value represents the actual aggregated net generation output in MW per market time unit (hour) and per production type.

Fuel Prices and Costs

Natural Gas, Netherlands TTF Natural Gas Forward Day Ahead, US$ per Million Metric British Thermal Unit

## New names:
## • `POILAPSP` -> `POILAPSP...17`
## • `POILAPSP` -> `POILAPSP...45`
## • `` -> `...89`
## • `` -> `...90`
## • `` -> `...91`
## • `` -> `...92`
## • `` -> `...93`
## • `` -> `...94`
## • `` -> `...95`

Imports (Costs and Levels)

Imports and export flows of electricity from ENTSOE Transparency Platform. Physical flows between bidding zones per market time unit. Physical flow is defined as the measured real flow of energy between neighbouring bidding zones on the cross borders.

Note 1: Net imports still has some missing data and I’m not quite sure where it comes from (see Austria, Denmark, Switzerland). Note 2: Also, the seeming upper and lower limits must have to do with capacity constraints on imports and exports (see Belgium, Norway, Sweden).

Day-ahead Solar and Wind Forecasts

A forecast of wind and solar power generation (MW) per country per hour of the following day data from ENTSOE Transparency Platform.

Combining Data

Approaching a model…

Below, I incorporate all explanatory variables (except solar and wind forecasts) above into a model of the mean (not yet variance). The first model incorporates the variables simply as levels whereas the second incorporates them as shares of total “load.”

Questions: - day-ahead versus current prices in all variables - are we not interested in deviations from forecasts for price-setting?

# Check to make sure data is ordered
de_full %>% arrange(date_utc) %>% all.equal(de_full)
## [1] TRUE
# The below model incorporates ARCH(24) to be selected over, available regressors for wind forecasts, solar forecasts, and imports to and from France. In line with Rintamaki et al, we incorporate moving average terms for half-day, daily, and weekly prices volatility (levels?). Seasonal moving average terms are not yet incorporated here as they are in Rintamaki et al. Rather we might want to consider the seasonal moving average to have a periodicity of 24 hours (moving average over the same time of day)
de_mod_levs <- arx(de_full$price_eur_m_whe, 
              mxreg = as.matrix(select(de_full, 
                                       'log_load', 
                                       'log_gen_biomass_mw',  'log_gen_gas_mw', 
                                       'log_gen_geothermal_mw', #'gen_nuclear_mw', 
                                       'log_gen_other_renewable_mw', 
                                       'log_gen_solar_mw', 
                                       'PNGASEU', 
                                       contains('hour'), 
                                       contains('month'),
                                       "net_imports_SE",
                                       "net_imports_PL",
                                       "net_imports_CZ",
                                       "net_imports_BE",
                                       "net_imports_CH",
                                       "net_imports_NO",
                                       "net_imports_NL",
                                       "net_imports_LU",
                                       "net_imports_FR",
                                       "net_imports_DK",
                                       "net_imports_AT"
                                       #"total_net_imports"
                                       )))# 'gen_wind_mw' 'gen_coal_mw', 'gen_hydro_mw',

de_mod_levs %>% plot

# Need to disable Ljung Box tests because GUM does not pass diagnostic tests
de_levs_sel <- getsm(de_mod_levs, ar.LjungB = NULL, arch.LjungB = NULL)
## 
## GUM mean equation:
## 
##                            reg.no. keep        coef   std.error   t-stat
## mconst                           1    0 -1.1662e+03  2.5507e+01 -45.7198
## log_load                         2    0  4.6348e+01  1.0749e+00  43.1197
## log_gen_biomass_mw               3    0  7.1141e+01  2.7168e+00  26.1854
## log_gen_gas_mw                   4    0  1.4581e+01  2.9734e-01  49.0367
## log_gen_geothermal_mw            5    0 -1.0599e+01  5.9365e-01 -17.8540
## log_gen_other_renewable_mw       6    0 -5.6735e+00  5.9850e-01  -9.4794
## log_gen_solar_mw                 7    0  4.6700e-01  7.3037e-02   6.3940
## PNGASEU                          8    0  5.5526e+00  1.2933e-02 429.3482
## hour_1                           9    0  1.1411e+00  8.0827e-01   1.4117
## hour_2                          10    0  2.3400e+00  8.1274e-01   2.8791
## hour_3                          11    0  1.4615e+00  8.1585e-01   1.7913
## hour_4                          12    0  1.3466e+00  8.1899e-01   1.6442
## hour_5                          13    0  3.1208e+00  8.1962e-01   3.8076
## hour_6                          14    0  8.5589e+00  8.2498e-01  10.3747
## hour_7                          15    0  1.3660e+01  8.4512e-01  16.1630
## hour_8                          16    0  8.9449e+00  9.0346e-01   9.9008
## hour_9                          17    0 -7.6736e-02  9.9922e-01  -0.0768
## hour_10                         18    0 -6.7853e+00  1.0582e+00  -6.4122
## hour_11                         19    0 -9.7737e+00  1.0888e+00  -8.9765
## hour_12                         20    0 -1.2400e+01  1.0984e+00 -11.2887
## hour_13                         21    0 -1.3822e+01  1.0990e+00 -12.5764
## hour_14                         22    0 -1.1524e+01  1.0910e+00 -10.5629
## hour_15                         23    0 -7.0978e+00  1.0799e+00  -6.5725
## hour_16                         24    0 -1.6550e+00  1.0614e+00  -1.5593
## hour_17                         25    0  7.5773e+00  1.0280e+00   7.3706
## hour_18                         26    0  1.1976e+01  9.7779e-01  12.2481
## hour_19                         27    0  1.1495e+01  9.4637e-01  12.1463
## hour_20                         28    0  5.8717e+00  9.1393e-01   6.4247
## hour_21                         29    0  1.8824e+00  8.7562e-01   2.1498
## hour_22                         30    0  2.1186e+00  8.3843e-01   2.5268
## hour_23                         31    0 -1.1040e+00  8.1193e-01  -1.3597
## month_2                         32    0 -1.5298e+00  5.6393e-01  -2.7128
## month_3                         33    0 -3.7984e+00  5.6332e-01  -6.7429
## month_4                         34    0  3.3007e+00  6.3082e-01   5.2323
## month_5                         35    0  6.5550e+00  6.8024e-01   9.6364
## month_6                         36    0  9.0390e+00  7.0277e-01  12.8621
## month_7                         37    0  8.9457e+00  7.0229e-01  12.7379
## month_8                         38    0  1.5083e+01  6.9426e-01  21.7254
## month_9                         39    0  1.6649e+01  6.4494e-01  25.8155
## month_10                        40    0  8.6800e+00  5.9076e-01  14.6929
## month_11                        41    0  3.7273e+00  5.6972e-01   6.5423
## month_12                        42    0  9.0482e+00  5.6683e-01  15.9629
## net_imports_SE                  43    0  5.8903e-03  4.4665e-04  13.1877
## net_imports_PL                  44    0 -2.9023e-03  3.1474e-04  -9.2213
## net_imports_CZ                  45    0  7.9559e-03  1.8233e-04  43.6345
## net_imports_BE                  46    0  1.7451e-02  3.3020e-04  52.8499
## net_imports_CH                  47    0  3.0716e-03  1.3094e-04  23.4587
## net_imports_NO                  48    0  3.7376e-02  3.2432e-04 115.2434
## net_imports_NL                  49    0  9.5948e-04  1.0681e-04   8.9829
## net_imports_LU                  50    0 -5.6405e-03  6.9234e-04  -8.1470
## net_imports_FR                  51    0 -2.2041e-03  1.0231e-04 -21.5429
## net_imports_DK                  52    0 -5.5652e-04  1.4302e-04  -3.8913
## net_imports_AT                  53    0  1.8771e-04  2.1113e-04   0.8891
##                              p-value    
## mconst                     < 2.2e-16 ***
## log_load                   < 2.2e-16 ***
## log_gen_biomass_mw         < 2.2e-16 ***
## log_gen_gas_mw             < 2.2e-16 ***
## log_gen_geothermal_mw      < 2.2e-16 ***
## log_gen_other_renewable_mw < 2.2e-16 ***
## log_gen_solar_mw           1.625e-10 ***
## PNGASEU                    < 2.2e-16 ***
## hour_1                     0.1580346    
## hour_2                     0.0039890 ** 
## hour_3                     0.0732416 .  
## hour_4                     0.1001384    
## hour_5                     0.0001404 ***
## hour_6                     < 2.2e-16 ***
## hour_7                     < 2.2e-16 ***
## hour_8                     < 2.2e-16 ***
## hour_9                     0.9387858    
## hour_10                    1.442e-10 ***
## hour_11                    < 2.2e-16 ***
## hour_12                    < 2.2e-16 ***
## hour_13                    < 2.2e-16 ***
## hour_14                    < 2.2e-16 ***
## hour_15                    4.979e-11 ***
## hour_16                    0.1189335    
## hour_17                    1.715e-13 ***
## hour_18                    < 2.2e-16 ***
## hour_19                    < 2.2e-16 ***
## hour_20                    1.329e-10 ***
## hour_21                    0.0315731 *  
## hour_22                    0.0115123 *  
## hour_23                    0.1739297    
## month_2                    0.0066731 ** 
## month_3                    1.563e-11 ***
## month_4                    1.678e-07 ***
## month_5                    < 2.2e-16 ***
## month_6                    < 2.2e-16 ***
## month_7                    < 2.2e-16 ***
## month_8                    < 2.2e-16 ***
## month_9                    < 2.2e-16 ***
## month_10                   < 2.2e-16 ***
## month_11                   6.095e-11 ***
## month_12                   < 2.2e-16 ***
## net_imports_SE             < 2.2e-16 ***
## net_imports_PL             < 2.2e-16 ***
## net_imports_CZ             < 2.2e-16 ***
## net_imports_BE             < 2.2e-16 ***
## net_imports_CH             < 2.2e-16 ***
## net_imports_NO             < 2.2e-16 ***
## net_imports_NL             < 2.2e-16 ***
## net_imports_LU             3.783e-16 ***
## net_imports_FR             < 2.2e-16 ***
## net_imports_DK             9.981e-05 ***
## net_imports_AT             0.3739647    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## 
## Diagnostics:
## 
##                   Chi-sq df p-value
## Ljung-Box AR(1)    73043  1       0
## Ljung-Box ARCH(1)  67003  1       0
## 7 path(s) to search
## Searching: 1 2 3 4 5 6 7
## 
##   Path 1: 9 17 53 12 11 
##   Path 2: 11 9 12 53 17 
##   Path 3: 12 9 53 11 17 
##   Path 4: 17 53 31 24 
##   Path 5: 24 31 53 17 
##   Path 6: 31 17 53 24 
##   Path 7: 53 17 31 24 
## 
## Terminal models:
## 
##         info(sc)      logl     n  k
## spec 1: 9.843718 -398596.2 81040 48
## spec 2: 9.843865 -398596.5 81040 49
## 
## Retained regressors (final model):
## 
##   mconst   log_load   log_gen_biomass_mw   log_gen_gas_mw   log_gen_geothermal_mw   log_gen_other_renewable_mw   log_gen_solar_mw   PNGASEU   hour_2   hour_5   hour_6   hour_7   hour_8   hour_10   hour_11   hour_12   hour_13   hour_14   hour_15   hour_16   hour_17   hour_18   hour_19   hour_20   hour_21   hour_22   hour_23   month_2   month_3   month_4   month_5   month_6   month_7   month_8   month_9   month_10   month_11   month_12   net_imports_SE   net_imports_PL   net_imports_CZ   net_imports_BE   net_imports_CH   net_imports_NO   net_imports_NL   net_imports_LU   net_imports_FR   net_imports_DK
de_levs_sel %>% plot

de_mod_shares <- arx(de_full$price_eur_m_whe, 
              mxreg = as.matrix(select(de_full, 
                                       'share_gen_biomass_mw',  
                                       'share_gen_gas_mw', 
                                       'share_gen_geothermal_mw', #'gen_nuclear_mw', 
                                       'share_gen_other_renewable_mw',
                                       'share_gen_solar_mw',
                                       'PNGASEU',
                                       contains('hour'), 
                                       contains('month'),
                                       share_net_imports)))# 'gen_wind_mw' 'gen_coal_mw', 'gen_hydro_mw',
              

de_mod_shares %>% plot

# Need to disable 
de_shares_sel <- getsm(de_mod_shares, ar.LjungB = NULL, arch.LjungB = NULL)
## 
## GUM mean equation:
## 
##                              reg.no. keep        coef   std.error   t-stat
## mconst                             1    0 -5.0108e+00  1.3520e+00  -3.7063
## share_gen_biomass_mw               2    0 -5.8392e+01  1.6940e+01  -3.4471
## share_gen_gas_mw                   3    0  3.1045e+02  3.1722e+00  97.8632
## share_gen_geothermal_mw            4    0 -8.2985e+04  1.8540e+03 -44.7609
## share_gen_other_renewable_mw       5    0  3.8669e+03  2.5273e+02  15.3003
## share_gen_solar_mw                 6    0 -4.6769e+01  1.6378e+00 -28.5567
## PNGASEU                            7    0  6.2317e+00  1.2175e-02 511.8624
## hour_1                             8    0 -4.9035e-01  8.9292e-01  -0.5491
## hour_2                             9    0 -5.8359e-01  8.9445e-01  -0.6525
## hour_3                            10    0 -1.9591e+00  8.9504e-01  -2.1888
## hour_4                            11    0 -2.5447e+00  8.9626e-01  -2.8393
## hour_5                            12    0  3.1240e-01  8.9721e-01   0.3482
## hour_6                            13    0  1.0094e+01  9.0437e-01  11.1614
## hour_7                            14    0  1.7931e+01  9.1415e-01  19.6146
## hour_8                            15    0  1.7806e+01  9.2055e-01  19.3433
## hour_9                            16    0  1.3200e+01  9.2688e-01  14.2411
## hour_10                           17    0  1.0522e+01  9.4452e-01  11.1396
## hour_11                           18    0  1.0339e+01  9.7492e-01  10.6052
## hour_12                           19    0  8.8475e+00  1.0037e+00   8.8152
## hour_13                           20    0  8.0161e+00  1.0224e+00   7.8401
## hour_14                           21    0  8.5076e+00  1.0283e+00   8.2735
## hour_15                           22    0  1.1450e+01  1.0200e+00  11.2249
## hour_16                           23    0  1.4647e+01  1.0025e+00  14.6106
## hour_17                           24    0  2.2365e+01  9.8303e-01  22.7514
## hour_18                           25    0  2.5761e+01  9.6432e-01  26.7144
## hour_19                           26    0  2.4500e+01  9.4505e-01  25.9247
## hour_20                           27    0  1.5842e+01  9.2458e-01  17.1337
## hour_21                           28    0  7.5555e+00  9.0988e-01   8.3038
## hour_22                           29    0  4.6499e+00  9.0128e-01   5.1593
## hour_23                           30    0 -5.4562e-01  8.9408e-01  -0.6103
## month_2                           31    0  3.4133e+00  6.1879e-01   5.5160
## month_3                           32    0  4.8084e+00  6.1572e-01   7.8093
## month_4                           33    0  8.8945e+00  6.7068e-01  13.2619
## month_5                           34    0  1.2304e+01  7.1430e-01  17.2257
## month_6                           35    0  1.0380e+01  7.2531e-01  14.3113
## month_7                           36    0  3.8372e+00  7.1732e-01   5.3494
## month_8                           37    0  8.5960e+00  7.1155e-01  12.0807
## month_9                           38    0  1.1752e+01  6.6559e-01  17.6570
## month_10                          39    0  8.9963e+00  6.3274e-01  14.2179
## month_11                          40    0  6.4386e+00  6.2559e-01  10.2921
## month_12                          41    0  6.6363e+00  6.2204e-01  10.6686
## share_net_imports                 42    0  1.1124e+02  1.8518e+00  60.0703
##                                p-value    
## mconst                       0.0002104 ***
## share_gen_biomass_mw         0.0005670 ***
## share_gen_gas_mw             < 2.2e-16 ***
## share_gen_geothermal_mw      < 2.2e-16 ***
## share_gen_other_renewable_mw < 2.2e-16 ***
## share_gen_solar_mw           < 2.2e-16 ***
## PNGASEU                      < 2.2e-16 ***
## hour_1                       0.5829055    
## hour_2                       0.5141075    
## hour_3                       0.0286109 *  
## hour_4                       0.0045225 ** 
## hour_5                       0.7276998    
## hour_6                       < 2.2e-16 ***
## hour_7                       < 2.2e-16 ***
## hour_8                       < 2.2e-16 ***
## hour_9                       < 2.2e-16 ***
## hour_10                      < 2.2e-16 ***
## hour_11                      < 2.2e-16 ***
## hour_12                      < 2.2e-16 ***
## hour_13                      4.557e-15 ***
## hour_14                      < 2.2e-16 ***
## hour_15                      < 2.2e-16 ***
## hour_16                      < 2.2e-16 ***
## hour_17                      < 2.2e-16 ***
## hour_18                      < 2.2e-16 ***
## hour_19                      < 2.2e-16 ***
## hour_20                      < 2.2e-16 ***
## hour_21                      < 2.2e-16 ***
## hour_22                      2.485e-07 ***
## hour_23                      0.5416971    
## month_2                      3.478e-08 ***
## month_3                      5.818e-15 ***
## month_4                      < 2.2e-16 ***
## month_5                      < 2.2e-16 ***
## month_6                      < 2.2e-16 ***
## month_7                      8.850e-08 ***
## month_8                      < 2.2e-16 ***
## month_9                      < 2.2e-16 ***
## month_10                     < 2.2e-16 ***
## month_11                     < 2.2e-16 ***
## month_12                     < 2.2e-16 ***
## share_net_imports            < 2.2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## 
## Diagnostics:
## 
##                   Chi-sq df p-value
## Ljung-Box AR(1)    74406  1       0
## Ljung-Box ARCH(1)  68887  1       0
## 4 path(s) to search
## Searching: 1 2 3 4
## 
##   Path 1: 8 30 9 12 
##   Path 2: 9 8 30 12 
##   Path 3: 12 8 30 9 
##   Path 4: 30 8 9 12 
## 
## Terminal models:
## 
##                 info(sc)      logl     n  k
## spec 1 (1-cut): 10.04581 -406841.4 81040 38
## 
## Retained regressors (final model):
## 
##   mconst   share_gen_biomass_mw   share_gen_gas_mw   share_gen_geothermal_mw   share_gen_other_renewable_mw   share_gen_solar_mw   PNGASEU   hour_3   hour_4   hour_6   hour_7   hour_8   hour_9   hour_10   hour_11   hour_12   hour_13   hour_14   hour_15   hour_16   hour_17   hour_18   hour_19   hour_20   hour_21   hour_22   month_2   month_3   month_4   month_5   month_6   month_7   month_8   month_9   month_10   month_11   month_12   share_net_imports
de_shares_sel %>% plot

# # Perform gets model selection over the log-variance model above
# # Turn of ARCH diagnostics as the GUM does not pass (could possible manipulate lag and p value choice here)
# de_vmod <- getsv(de_mod, t.pval = 0.001, ar.LjungB = NULL)
# 
# de_vmod %>% plot
# 
# data_de %>% filter(de_price < 0)

(TBA) Spotlight on UK, Germany, Denmark

Here, see the time series for Germany and Denmark (to compare to the data avialable in Rintamaki et al. - color portion of the TS plots). UK spotlight to discuss potential interest to David.

Daily and Monthly Prices

(TBA) Full Extension to Europe

Using data from EMBER on European wholesale electricity prices (hourly - daily and monthly also exist), I perform the same analysis as above. The hourly prices are the day-ahead wholesale prices by country.

The following is data from ENTSO-E on hourly electricity loads.